13.03.2012 מבחן סוף סמסטר מועד ב' מרצה אחראי: פרופ"ח ארז פטרנק מתרגלים: עדי סוסנוביץ מיה ארבל הוראות: א. ב. ג. ד. ה. ו. ז. ח. ט. י. המבחן אנונימי! נא לרשום רק מספר זהות ולא את השם. בטופס המבחן 11 עמודים מהם 4 דפי נוסחאות. בדקו שכל העמודים ברשותכם. משך המבחן שלוש שעות (180 דקות). אסור כל חומר עזר פרט לדף הנוסחאות המצורף לבחינה. במבחן 6 שאלות. כל השאלות הינן חובה. משקל כל שאלה מופיע בראשיתה. (חלוקת המשקל בין הסעיפים בכל שאלה אינה בהכרח אחידה.) ניתן לציין לגבי סעיף או שאלה "לא יודע/ת". תשובה זו תזכה ב- 20% מהניקוד של הסעיף או השאלה. תשובות שגויות לא יזכו בניקוד. חובה לנמק כל תשובה. לא יינתן ניקוד על תשובות ללא נימוק. קראו את כל המבחן לפני שאתם מתחילים לענות על השאלות. אין צורך להגיש את הטופס בתום הבחינה. את התשובות לשאלות יש לרשום במחברת הבחינה בלבד. בהצלחה!
שאלה 1: bison וניתוח סמנטי (15 נקודות) נתון להלן חלק מקובץ, bison המתאר דקדוק שמאפשר לגזור ביטויים בוליאניים. P rog, Expr, Term, משתני הגזירה בדקדוק הם: Factor TRUE, FALSE, NOT, OR, והאסימונים : AND %% Prog : Expr '\n' ; Expr : Expr OR Term Term ; Term : Term AND Factor Factor ; Factor : NOT Factor '(' Expr ')' TRUE FALSE ; %% - - א) ב) נתון רצף האסימונים הבא: TRUEOR NOT FALSE AND FALSEOR NOT TRUE האם קיים עבורו עץ גזירה חוקי ע"פ הדקדוק הנתון? אם כן ציירו את עץ הגזירה המלא. אם לא, נמקו מדוע לא קיים. אם קיים עץ גזירה, האם הוא יחיד או שישנן עוד אפשרויות לגזור את הביטוי? נמקו. הוסיפו פעולות סמנטיות על מנת שפלט המנתח שנוצר ע"י bison יהיה ערך האמת של הביטוי. הערות: - יש להניח כי בחלק העליון של קובץ ה- bison הובאה ההגדרה הבאה typedef char yystype; אין לשנות את הדקדוק בשום צורה (גם לא עם מרקרים). אין לשנות את טיפוס.YYSTYPE
Prog E E EOR E E E AND E E NOT E E '(' E ') ' E TRUE E FALSE ג) יוסי החליט שהדקדוק המקורי מסובך מדי לתיאור שפת ביטויים בוליאניים. הוא הציע את הדקדוק הבא במקום: מהו השינוי שיוסי צריך לבצע בקוד ה- bison בחלק ה- declarations חלקי קובץ ), bison על מנת שיוכל להשתמש בדקדוק שלו? נמקו. (החלק הראשון מבין שלושת שאלה 2: הקצאות זכרון א. ב. (15 נקודות) תארו יתרון אחד וחיסרון אחד של אלגוריתם סימון וטאטוא על פני אלגוריתם העתקה. נניח שתוכנית משתמשת לאורך זמן בגודל שטח קבוע של 10 מגהבייט. כלומר, במהלך התוכנית אובייקטים מוקצים ומתים, אך סה"כ שטח האובייקטים שבשימוש בכל רגע נתון נשאר 10 מגהבייט. נניח את זה אפילו באופן קיצוני, כלומר על כל אובייקט שנעשה לא נגיש בגודל מסויים, מוקצה מיד אובייקט אחד (או כמה אובייקטים) כך שחוזרים לאותו גודל שטח. כמו כן נניח שלאורך ריצת התוכנית כולה היא מקצה סה"כ שטח של 100 מגהבייט. a. לשם איסוף זבל, משתמשים באלגוריתם העתקה כך שגודל חצי ה- heap הוא 20 מגהבייט. כמה מחזורי איסוף נצטרך לבצע במהלך התוכנית? b. כמה שטח יועתק סה"כ בכל האיסופים במהלך התוכנית? c. נניח עתה שגודל חצי ה- heap הוא 50 מגהבייט. כמה מחזורי איסוף יידרשו עתה? ואיזה שטח יועתק ע"י כל האיסופים במהלך הריצה כולה? d. הכלילו את הדוגמאות לנוסחה עם פרמטרים: גודל השטח הנגיש עבור התוכנית M, גודל חצי ה- heap, H, וכמות הקצאה A לאורך הריצה. הנוסחה תאמר כמה שטח יועתק בכל האיסופים של התוכנית. e. הסבירו, לפי נוסחה זו, מה הקשר בין גודל ה- heap לכמות העבודה שהאיסוף חייב לעשות בזמן ריצתה. האם ניתן לקבוע כך את כמות העבודה להיות קטנה כרצוננו? עבור אילו גדלי - heap כמות העבודה של האיסוף תהיה מינימלית? f. מה המחיר שאנו משלמים כאשר אנו מורידים את כמות העבודה של האיסוף? 15) שאלה 3: מנתחי LL נקודות) א) נסמן: - firstk, followk, selectk פונקציות המתאימות לבניית מנתח.LL(k) ניתן להניח שהקלט אותו מנתחים מסתיים ברצף של k תווי $, עבור ניתוח LL(k) שלו.
נתון הדקדוק הבא: (נסמן את אוסף כללי הגזירה שלו ב ( P S aac abbc A c ca B c רשמו מה מכיל k ( ) select p לכל כלל גזירה מהו ה- k המינימלי שעבורו הדקדוק הוא k שבחרתם מתאים. p P. 1 k בדקדוק הנתון ולכל 4?LL(k) נמקו מדוע k נמוך יותר אינו מתאים ומדוע ה-.1.2 ב) כמה עמודות לכל היותר יהיו בטבלת הניתוח של מנתח LL(k) עם ה- K מסעיף א' 2, עבור דקדוק כלשהו בעל קבוצת טרמינלים הזהה לזו שבדקדוק הנתון? נמקו. בנו את טבלת הניתוח עבור מנתח LL(k) עם ה- K המינימלי שעבורו הדקדוק הוא.LL(k) אין צורך לרשום עמודות ריקות בטבלת הניתוח. ג) האם ניתן למצוא דקדוק שגוזר אותה שפה כמו שפת הדקדוק הנתון, ואשר נמצא ב- LL(k ) עבור k ' < k (כאשר אנו מתייחסים ל- k עליו דובר בסעיף א' 2 ). אם כן, מהו אותו דקדוק ומהו 'k המינימלי העונה על הדרישות? נמקו מדוע הדקדוק ב- LL(k') והוכיחו ששפתו זהה לשפת הדקדוק מסעיף א'. אם לא נמקו מדוע לא ניתן למצוא דקדוק כזה. שאלה 4 מנתחי ) LR 10 נקודות) א) ב) בהינתן אוטומט LR(1) של דקדוק מסוים, תארו כיצד ניתן לזהות אם האוטומט גדול ממש (מבחינת מספר המצבים) לעומת אוטומט LR(0) של אותו דקדוק. פעולת הזיהוי צריכה להתבסס על האוטומט LR(1) הנתון בלבד. הביאו דוגמה לדקדוק G שנמצא ב LR(1), שעבורו אוטומט LR(0) קטן ממש (מבחינת מספר המצבים) מאוטומט LR(1) שלו. יש לבנות את האוטומטים במלואם על מנת להראות כי אכן הדרישה מתקיימת. שימו לב כי ניתן למצוא דקדוק המכיל 2 משתני גזירה ו- 2 טרמינלים המקיים את התנאים. יש לבנות גם את אוטומט LR(0), אפילו אם הוא מכיל קונפליקטים. - -
) 20 נקודות) שאלה - 5 DFA נתונה שפה, עבורה אחת הדרישות שעליה לקיים בזמן ריצה, היא גילוי של הפעלת מתודה על משתנה כאשר המשתנה בעצם מצביע ל-.null למשל: בהפעלת x.f() יש לבדוק האם המשתנה x מצביע ל-.null במקרה שמתגלה ערך null כזה, התוכנית תפסיק את פעולתה ותחזיר הודעת שגיאה. מימוש נאיבי של בדיקה זו ידרוש ביצוע של מספר instructions נוספים בשפת היעד, בכל פעם שיש קריאה למתודה דבר שעשוי לפגוע בביצועי תכניות הכתובות בשפה זו. בשאלה זו נחקור דרכים להקטנת מס' הבדיקות המתווספות בזמן הריצה. x= y # assignment x= y. m( x,..., x ) # method invocation 1 n x= new( A) # createanewobject ( of someclass A) goto L # unconditional jump if x= y gotol # conditional jump תאור הפקודות בשפה: יש להניח כי העברת פרמטרים למתודה היא by-value ולא.by-reference xbar. (); (* 1 *)... xfoo. (); (* 2 *) א) נניח שנתון חלק הקוד הבא: נשים לב שניתן להסיר את הבדיקה של null בשורה 2 אם ידוע שהערך של x לא השתנה מאז הפעם האחרונה בה בדקנו אם x הוא null בשורה 1. לבדיקת התנאי הזה, יש להשתמש בניתוח.DFA הציעו ניתוח DFA שבסופו נוכל לדעת עבור כניסה ויציאה של כל בלוק, לכל משתנה לוקלי, האם יש לבצע את הבדיקה של null על המשתנה. ציינו את פריטי המידע בקבוצות out(b), in(b), את כיוון זרימת המידע, האם הבעיה היא מסוג f B may או, must מהן משוואות הזרימה, מהי הפונקציה וכיצד יאותחלו הקבוצות. ב) בהינתן האנליזה מסעיף א', תארו כיצד ניתן לדעת עבור בלוק נתון כלשהו, ועבור כל פקודה של הפעלת מתודה בתוך הבלוק, האם יש להוסיף את הבדיקה לגילוי הערך null בזמן ריצה או לא. יש להשתמש בערכים שחישבה האנליזה מסעיף א'.
25) שאלה - 6 Backpatching נקודות) בשאלה זו נדון בהרחבה לשפת הדקדוק הבסיסי שראינו בתרגולים. במסגרת ההרחבה, הוחלט לאפשר לביטוי בוליאני להיות משוערך גם לערך, dont _ know פרט לערכים trueו-. false להלן תיאור הסמנטיקה של ערך :dont _ know עבור הקוד הבא בשפת המקור: if ( B) S else S 1 2, S 2 S 1 אם B משוערך ל:, dont _ know אזי יתאפשר ביצוע אקראי בזמן ריצה. ועבור הקוד הבא בשפת המקור: או ביצוע וההחלטה על כך תתבצע באופן if ( B) S 1 S 1 אם B משוערך ל: dont _ know אקראי בזמן ריצה., אזי יתאפשר ביצוע או אי-ביצוע, S 1 וההחלטה על כך תתבצע באופן לשם כך, התווסף לאוסף כללי הגזירה של B (המשתנה הגוזר ביטויים בוליאניים) הכלל:. B dont _ know ). false - טרמינל בדקדוק, בדיוק כמו trueו dontהוא _ know ) gotol 1, בנוסף, לשפת הביניים התווספה הפקודה: L2. L 2 L 1 לבין כתובת הקפיצה כתובת הקפיצה, שמשמעותה היא בחירה אקראית (בזמן ריצה) בין הערה: עבור ביצוע: ) quad, backpatch ( list, אם קיימת ב- listכתובת (נניח ( L שכבר בוצע לה backpatchבמהלך הריצה של המנתח, אזי quad ישורשר (עם אופרטור ',' ( לכתובת האחרונה שהוטלאה בפקודת ה- goto (שכתובתה ( L בעקבות ה- backpatchהקודם שבוצע. טבלאות האמת של פעולות בוליאניות בלוגיקה החדשה מפורטות להלן: עבור פעולת : AND AND עבור פעולת : OR OR
א) בהינתן הלוגיקה החדשה, הציעו סכמת תרגום בשיטת Backpatching עבור כללי הגזירה של המשתנה B. שימו לב להנחיות ולדרישות מהפתרון, המובאים בסוף השאלה. בפרט, שימו לב לכך שאין להוסיף תכונות סמנטיות למשתני הגזירה, מעבר לתכונות הסמנטיות שנלמדו ואשר מפורטות בדף הנוסחאות. להלן כללי הגזירה עבורם עליכם להציע סכימת תרגום: B true B false B dont _ know B B or B 1 2 B B and B 1 2 B E rope 1 2 ב) כעת, הוחלט לשנות את הלוגיקה, כך שבכל פעולה בוליאנית שבה אחד הארגומנטים שוערך ל-. dont _ know תשוערך אף היא ל-,תוצאתה dont _ know הציעו סכמת תרגום בשיטת Backpatching ע"פ הלוגיקה החדשה, עבור כללי הגזירה מהסעיף הקודם. הנחיות לשני הסעיפים: - אין להוסיף תכונות סמנטיות למשתני הגזירה, מעבר לתכונות שהגדרנו בתרגול (ואשר מופיעות בדפי הנוסחאות המצורפים). - אין להוסיף כללי גזירה. - מותר להשתמש אך ורק במרקרים M,N שהכרנו בתרגול (עם הפעולות הסמנטיות שהוגדרו עבורם). - מותר להשתמש בפונקציות עזר נוספות על רשימות,כלומר, על טיפוס.list (מעבר לאלו המפורטים בדפי הנוסחאות). על כל פונקציה שנעשה בה שימוש יש להסביר בקצרה מה הפונקציה מבצעת. בהצלחה!!
נוסחאות ואלגוריתמים כל ההגדרות מתייחסות לדקדוק( S.G = (V, T, P, first(α) = { t T α * tβ β (V T)* } Top Down follow(a) = { t T {$} S$ * αatβ α (V T)* β (V T)*(ε $) } select(a α) = first(α) follow(a) first(α) α * ε otherwise הגדרה: דקדוק G הוא ( LL(1 אם ורק אם לכל שני כללים ב- G השייכים לאותו משתנה A מתקיים: select(a α) select(a β) = הגדרת טבלת המעברים P {error} M : V (T {$}) עבור דקדוק :LL(1) M[A, t] = A α error t select(a α) t select(a α) for all A α P Q.push(S) while!q.empty() do X = Q.pop() t = next token if X T then if X = t then SHIFT else ERROR else end if end while t = next token if t = $ then ACCEPT else ERROR // X V if M[X, t] = error then ERROR else REPLACE(X, t) אלגוריתם מנתח :LL(1)
Bottom Up פריט LR(0) הוא α β) (A כאשר A αβ P סגור (closure) על קבוצת פריטים I מוגדר באופן אינדוקטיבי:.closure(I) = I בסיס: o (B γ) closure(i) גם,B γ P אז לכל,(A α Bβ) closure(i) צעד: אם o ולכל first(βt),x גם פונקציית המעברים של האוטומט: δ(i, X) = { closure(a αx β) (A α Xβ) I } פריט LR(1) הוא t) (A α β, כאשר t T {$},A αβ P סגור (closure) על קבוצת פריטים I מוגדר באופן אינדוקטיבי:.closure(I) = I בסיס: o B γ P אז לכל,(A α Bβ, t) closure(i) צעד: אם o (B γ, x) closure(i) פונקציית המעברים של האוטומט: δ(i, X) = { closure(a αx β, t) (A α Xβ, t) I } SHIFT j δ(i i,t) = I j action[i, t] = REDUCE k rule k is A α, (A α ) I i and t follow(a) ACCEPT (S S ) I i and t = $ ERROR otherwise הגדרת טבלת action למנתח :SLR SHIFT j δ(i i,t) = I j action[i, t] = REDUCE k rule k is A α and (A α, t) I i ACCEPT (S S, $) I i and t = $ ERROR otherwise הגדרת טבלת action למנתח :LR(1) הגדרת טבלת goto למנתח SLR ו- :LR(1) goto[i, X] = j error δ(i i, X) = I j otherwise
אלגוריתם מנתח :shift/reduce Q.push(0) // where 0 is the initial state of the prefix automaton while true do k = Q.top().state t = next token do action[k, t] end while ניתוח סמנטי :L-attributed proceduredfvisit(node n) : foreach child m of n in left-to-right order do evaluate the inherited attributes of m dfvisit(m) end evaluate the synthesized attributes of n אלגוריתם dfvisit לניתוח סמנטי עבור הגדרות ייצור קוד בשיטת Backpatching פונקציות: makelist(quad) merge(list1,list2) emit(code string) nextquad() backpatch(list, quad) newtemp() יוצרת רשימה ריקה עם איבר אחד (ה"חור".(quad מחזירה רשימה ממוזגת של הרשימות list1, list2 מדפיסה קוד בשפת הביניים ומאפשרת להדפיס פקודות קפיצה עם "חורים". מחזירה את כתובת הרביעיה (הפקודה) הבאה שתצא לפלט. מקבלת רשימת "חורים" list וכתובת,quad ו"מטליאה" את הרשימה כך שבכל החורים תופיע הכתובת.quad מחזירה שם של משתנה זמני חדש שאינו נמצא בשימוש בתכנית. משתנים סטנדרטיים: S: גוזר פקודות (statements) בשפה. תכונות: :nextlist o רשימת כתובות של פקודות המכילות חור שיש להטליא בכתובת הפקודה הבאה לביצוע אחרי הפקודה הנגזרת מ- S. B: גוזר ביטויים בוליאניים. תכונות: :truelist o רשימת כתובות של פקודות המכילות חור שיש להטליא בכתובת אליה יש לקפוץ אם הביטוי הבוליאני מתקיים. :falselist o רשימת כתובות של פקודות המכילות חור שיש להטליא בכתובת אליה יש לקפוץ אם הביטוי הבוליאני אינו מתקיים. E: גוזר ביטויים אריתמטיים. תכונות: :E.place o שם המשתנה הזמני לתוכו מחושב הביטוי האריתמטי.
קוד ביניים x := y op z x := op y x := y goto L if x relop y goto L param x call p, n return y x := y [ i ] x [ i ] := y x := addr y x := * y * x := y סוגי פקודות בשפת הביניים: 1. משפטי השמה עם פעולה בינארית 2. משפטי השמה עם פעולה אונרית 3. משפטי העתקה 4. קפיצה בלתי מותנה 5. קפיצה מותנה 6. פרמטרים וקריאה לפרוצדורות indexed assignments.7 8. השמה של כתובות ומצביעים in(b) = out(b) = (S,B) E f B out(s) ( in(b) ) in(b) = Data-Flow Analysis ההגדרות מתייחסות ל.G=(V,E):CFG הצורה הכללית של המשוואות בחישוב סריקה קדמית: או (S,B) E out(s) out(b) = in(b) = f (B,S) E B in(s) out(b) = הצורה הכללית של המשוואות בחישוב סריקה אחורית: או ( out(b) ) (B,S) E in(s)